/*
编写控制台（字符界面）应用程序，实现文件按字节异或加密。
要求输入一字节密钥key和源文件名。建立加密文件，加密文件第1字节为密钥key，以后各字节为源文件各字节与密钥进行异或运算的结果。
编写另一程序，实现解密（由加密文件还原源文件）。
此题鼓励同学自拟图形界面，综合运用对话框或视窗、文件对话框、多种Component、事件响应来实现加密解密功能。
 */
//加密文件
import java.io.*;
import java.util.Scanner;
public class Demo03 {
    public static void main(String[] args) {
        System.out.println("#加密文件#");
        System.out.println("请输入密钥、源文件和目的文件路径");
        System.out.print("一字节密钥（0~255）：");
        int key;
        Scanner in_key = new Scanner(System.in);
        key = in_key.nextInt(); //返回一字节密钥
        System.out.print("源文件路径：");
        String SrcfileName = inputFileName();
        String DestfileName = "C:\\Users\\98317\\Desktop\\JavaExerciseCode\\exci07\\加密文件.txt";
        Lock(key, SrcfileName, DestfileName);
    }
    //获取输入的文件名
    private static String inputFileName() {
        String fileName = null;
        //System.in是Stream，InputStreamReader把字节流格式化为字符流读取，以字符流的形式读取输入缓冲区
        BufferedReader buffRead = new BufferedReader(new InputStreamReader(System.in));
        try {
            fileName = buffRead.readLine();  //得到字符串形式的文件路径
        } catch (IOException error) {   //抛出异常
            error.printStackTrace();
        }
        return fileName;
    }
    //加密
    public static void Lock(int key, String SrcfileName, String DestfileName) {
        try {
            BufferedInputStream SrcFile = new BufferedInputStream(new FileInputStream(SrcfileName));
            BufferedOutputStream DestFile = new BufferedOutputStream(new FileOutputStream(DestfileName));
            //写入key
            DestFile.write(key);
            for (int i; (i = SrcFile.read()) >= 0; )
                DestFile.write(i ^ key);
            System.out.println("加密成功！");
            DestFile.close();
            SrcFile.close();
        } catch (IOException error) {
            error.printStackTrace();
        }
    }
}
